Some cleanup in tpm-related files.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 21 Sep 2005 10:13:11 +0000 (10:13 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 21 Sep 2005 10:13:11 +0000 (10:13 +0000)
Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
linux-2.6-xen-sparse/arch/xen/Kconfig
linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.c
linux-2.6-xen-sparse/drivers/xen/tpmfront/tpmfront.h
tools/python/xen/xend/server/tpmif.py
xen/include/public/io/tpmif.h

index 07b5e85cee464e51a5e7649604371abb2ec5061e..31751c41f326b85bac627086266fcd1828c9defd 100644 (file)
@@ -73,6 +73,8 @@ config XEN_NETDEV_BACKEND
 config XEN_TPMDEV_FRONTEND
         bool "TPM-device frontend driver"
         default n
+       select TCG_TPM
+       select TCG_XEN
         help
           The TPM-device frontend driver.
 
index 5343289f203e8b22f1b40b6bd71e3d37781fb2f4..3c585e6bcd99abc4bc890c8969efc541aca6a330 100644 (file)
@@ -1,4 +1,4 @@
-/******************************************************************************
+ /******************************************************************************
  * drivers/xen/tpmback/interface.c
  *
  * Vritual TPM interface management.
 
 static kmem_cache_t *tpmif_cachep;
 int num_frontends = 0;
-LIST_HEAD(tpmif_list);
 
+LIST_HEAD(tpmif_list);
 
-tpmif_t *alloc_tpmif(domid_t domid, long int instance)
+tpmif_t *
+alloc_tpmif(domid_t domid, long int instance)
 {
-    struct page *page;
-    tpmif_t *tpmif;
+       struct page *page;
+       tpmif_t *tpmif;
 
-    tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
-    if (!tpmif)
-        return ERR_PTR(-ENOMEM);
+       tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
+       if (!tpmif)
+               return ERR_PTR(-ENOMEM);
 
-    memset(tpmif, 0, sizeof(*tpmif));
-    tpmif->domid        = domid;
-    tpmif->status       = DISCONNECTED;
-    tpmif->tpm_instance = instance;
-    atomic_set(&tpmif->refcnt, 1);
+       memset(tpmif, 0, sizeof (*tpmif));
+       tpmif->domid = domid;
+       tpmif->status = DISCONNECTED;
+       tpmif->tpm_instance = instance;
+       atomic_set(&tpmif->refcnt, 1);
 
-    page = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE);
-    BUG_ON(page == NULL);
-    tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
+       page = balloon_alloc_empty_page_range(TPMIF_TX_RING_SIZE);
+       BUG_ON(page == NULL);
+       tpmif->mmap_vstart = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
 
-    list_add(&tpmif->tpmif_list, &tpmif_list);
-    num_frontends++;
+       list_add(&tpmif->tpmif_list, &tpmif_list);
+       num_frontends++;
 
-    return tpmif;
+       return tpmif;
 }
 
-
-void free_tpmif(tpmif_t *tpmif)
+void
+free_tpmif(tpmif_t * tpmif)
 {
-    num_frontends--;
-    list_del(&tpmif->tpmif_list);
-    kmem_cache_free(tpmif_cachep, tpmif);
+       num_frontends--;
+       list_del(&tpmif->tpmif_list);
+       kmem_cache_free(tpmif_cachep, tpmif);
 }
 
-
-tpmif_t *tpmif_find(domid_t domid, long int instance)
+tpmif_t *
+tpmif_find(domid_t domid, long int instance)
 {
-    tpmif_t *tpmif;
-
-    list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
-        if (tpmif->tpm_instance == instance) {
-            if (tpmif->domid == domid) {
-                tpmif_get(tpmif);
-                return tpmif;
-           } else {
-               return NULL;
-           }
-        }
-    }
-
-    return alloc_tpmif(domid, instance);
+       tpmif_t *tpmif;
+
+       list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
+               if (tpmif->tpm_instance == instance) {
+                       if (tpmif->domid == domid) {
+                               tpmif_get(tpmif);
+                               return tpmif;
+                       } else {
+                               return NULL;
+                       }
+               }
+       }
+
+       return alloc_tpmif(domid, instance);
 }
 
-
-static int map_frontend_page(tpmif_t *tpmif, unsigned long localaddr,
-                            unsigned long shared_page)
+static int
+map_frontend_page(tpmif_t * tpmif, unsigned long localaddr,
+                 unsigned long shared_page)
 {
-    struct gnttab_map_grant_ref op = {
-        .host_addr = localaddr,
-        .flags     = GNTMAP_host_map,
-        .ref       = shared_page,
-        .dom       = tpmif->domid,
-    };
-
-    BUG_ON( HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) );
-
-    if (op.handle < 0) {
-       DPRINTK(" Grant table operation failure !\n");
-       return op.handle;
-    }
-
-    tpmif->shmem_ref    = shared_page;
-    tpmif->shmem_handle = op.handle;
-    tpmif->shmem_vaddr  = localaddr;
-    return 0;
+       struct gnttab_map_grant_ref op = {
+               .host_addr = localaddr,
+               .flags = GNTMAP_host_map,
+               .ref = shared_page,
+               .dom = tpmif->domid,
+       };
+
+       BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
+
+       if (op.handle < 0) {
+               DPRINTK(" Grant table operation failure !\n");
+               return op.handle;
+       }
+
+       tpmif->shmem_ref = shared_page;
+       tpmif->shmem_handle = op.handle;
+       tpmif->shmem_vaddr = localaddr;
+       return 0;
 }
 
-
-static void unmap_frontend_page(tpmif_t *tpmif)
+static void
+unmap_frontend_page(tpmif_t * tpmif)
 {
-    struct gnttab_unmap_grant_ref op;
+       struct gnttab_unmap_grant_ref op;
 
-    op.host_addr = tpmif->shmem_vaddr;
-    op.handle = tpmif->shmem_handle;
-    op.dev_bus_addr = 0;
+       op.host_addr = tpmif->shmem_vaddr;
+       op.handle = tpmif->shmem_handle;
+       op.dev_bus_addr = 0;
 
-    BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
+       BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
 }
 
-
-int tpmif_map(tpmif_t *tpmif,
-              unsigned long shared_page, unsigned int evtchn)
+int
+tpmif_map(tpmif_t * tpmif, unsigned long shared_page, unsigned int evtchn)
 {
-    struct vm_struct *vma;
-    evtchn_op_t op = { .cmd = EVTCHNOP_bind_interdomain };
-    int err;
-
-    BUG_ON(tpmif->remote_evtchn);
-
-    if ( (vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL )
-       return -ENOMEM;
-
-    err = map_frontend_page(tpmif,
-                            VMALLOC_VMADDR(vma->addr),
-                            shared_page);
-    if (err) {
-        vfree(vma->addr);
-       return err;
-    }
-
-    op.u.bind_interdomain.dom1 = DOMID_SELF;
-    op.u.bind_interdomain.dom2 = tpmif->domid;
-    op.u.bind_interdomain.port1 = 0;
-    op.u.bind_interdomain.port2 = evtchn;
-    err = HYPERVISOR_event_channel_op(&op);
-    if (err) {
-       unmap_frontend_page(tpmif);
-       vfree(vma->addr);
-       return err;
-    }
-
-    tpmif->evtchn = op.u.bind_interdomain.port1;
-    tpmif->remote_evtchn = evtchn;
-
-    tpmif->tx = (tpmif_tx_interface_t *) vma->addr;
-
-    bind_evtchn_to_irqhandler(tpmif->evtchn,
-                              tpmif_be_int,
-                              0,
-                              "tpmif-backend",
-                             tpmif);
-    tpmif->status        = CONNECTED;
-    tpmif->shmem_ref     = shared_page;
-    tpmif->active        = 1;
-
-    return 0;
+       struct vm_struct *vma;
+       evtchn_op_t op = {.cmd = EVTCHNOP_bind_interdomain };
+       int err;
+
+       BUG_ON(tpmif->remote_evtchn);
+
+       if ((vma = get_vm_area(PAGE_SIZE, VM_IOREMAP)) == NULL)
+               return -ENOMEM;
+
+       err = map_frontend_page(tpmif, VMALLOC_VMADDR(vma->addr), shared_page);
+       if (err) {
+               vfree(vma->addr);
+               return err;
+       }
+
+       op.u.bind_interdomain.dom1 = DOMID_SELF;
+       op.u.bind_interdomain.dom2 = tpmif->domid;
+       op.u.bind_interdomain.port1 = 0;
+       op.u.bind_interdomain.port2 = evtchn;
+       err = HYPERVISOR_event_channel_op(&op);
+       if (err) {
+               unmap_frontend_page(tpmif);
+               vfree(vma->addr);
+               return err;
+       }
+
+       tpmif->evtchn = op.u.bind_interdomain.port1;
+       tpmif->remote_evtchn = evtchn;
+
+       tpmif->tx = (tpmif_tx_interface_t *) vma->addr;
+
+       bind_evtchn_to_irqhandler(tpmif->evtchn,
+                                 tpmif_be_int, 0, "tpmif-backend", tpmif);
+       tpmif->status = CONNECTED;
+       tpmif->shmem_ref = shared_page;
+       tpmif->active = 1;
+
+       return 0;
 }
 
-
-static void __tpmif_disconnect_complete(void *arg)
+static void
+__tpmif_disconnect_complete(void *arg)
 {
-    evtchn_op_t op = { .cmd = EVTCHNOP_close };
-    tpmif_t *tpmif = (tpmif_t *) arg;
+       evtchn_op_t op = {.cmd = EVTCHNOP_close };
+       tpmif_t *tpmif = (tpmif_t *) arg;
 
-    op.u.close.port = tpmif->evtchn;
-    op.u.close.dom  = DOMID_SELF;
-    HYPERVISOR_event_channel_op(&op);
-    op.u.close.port = tpmif->remote_evtchn;
-    op.u.close.dom  = tpmif->domid;
-    HYPERVISOR_event_channel_op(&op);
+       op.u.close.port = tpmif->evtchn;
+       op.u.close.dom = DOMID_SELF;
+       HYPERVISOR_event_channel_op(&op);
+       op.u.close.port = tpmif->remote_evtchn;
+       op.u.close.dom = tpmif->domid;
+       HYPERVISOR_event_channel_op(&op);
 
-    if (tpmif->evtchn)
-         unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif);
+       if (tpmif->evtchn)
+               unbind_evtchn_from_irqhandler(tpmif->evtchn, tpmif);
 
-    if (tpmif->tx) {
-        unmap_frontend_page(tpmif);
-        vfree(tpmif->tx);
-    }
+       if (tpmif->tx) {
+               unmap_frontend_page(tpmif);
+               vfree(tpmif->tx);
+       }
 
-    free_tpmif(tpmif);
+       free_tpmif(tpmif);
 }
 
-
-void tpmif_disconnect_complete(tpmif_t * tpmif)
+void
+tpmif_disconnect_complete(tpmif_t * tpmif)
 {
-    INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif);
-    schedule_work(&tpmif->work);
+       INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif);
+       schedule_work(&tpmif->work);
 }
 
-
-void __init tpmif_interface_init(void)
+void __init
+tpmif_interface_init(void)
 {
-    tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof(tpmif_t),
-                                     0, 0, NULL, NULL);
+       tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t),
+                                        0, 0, NULL, NULL);
 }
index ae94b3bbef2fadad414001e54d2d760c1ee6c424..6cada9ae142175974b8dd7ea59022217e6009518 100644 (file)
@@ -257,18 +257,24 @@ static int setup_tpmring(struct xenbus_device *dev,
 
        tpm_allocate_buffers(tp);
 
-       info->ring_ref = gnttab_claim_grant_reference(&gref_head);
-       ASSERT(info->ring_ref != -ENOSPC);
-       gnttab_grant_foreign_access_ref(info->ring_ref,
-                                       backend_id,
-                                       (virt_to_machine(tp->tx) >> PAGE_SHIFT),
-                                       0);
+       err = gnttab_grant_foreign_access(backend_id,
+                                         (virt_to_machine(tp->tx) >> PAGE_SHIFT),
+                                         0);
+
+       if (err == -ENOSPC) {
+               free_page((unsigned long)sring);
+               tp->tx = NULL;
+               xenbus_dev_error(dev, err, "allocating grant reference");
+               return err;
+       }
+       info->ring_ref = err;
 
        op.u.alloc_unbound.dom = backend_id;
        err = HYPERVISOR_event_channel_op(&op);
        if (err) {
+               gnttab_end_foreign_access(info->ring_ref, 0);
                free_page((unsigned long)sring);
-               tp->tx = 0;
+               tp->tx = NULL;
                xenbus_dev_error(dev, err, "allocating event channel");
                return err;
        }
@@ -282,6 +288,7 @@ static void destroy_tpmring(struct tpmfront_info *info, struct tpm_private *tp)
        tpmif_set_connected_state(tp,0);
 
        if ( tp->tx != NULL ) {
+               gnttab_end_foreign_access(info->ring_ref, 0);
                free_page((unsigned long)tp->tx);
                tp->tx = NULL;
        }
index d1d744d6d6cd7eaae49335d770cce8e8212be89e..28d76e176f1b30ee190ef096876802ca7b7ade99 100644 (file)
@@ -2,7 +2,8 @@
 #define TPM_FRONT_H
 
 
-struct tpm_private {
+struct tpm_private
+{
        tpmif_tx_interface_t *tx;
        unsigned int evtchn;
        int connected;
@@ -29,7 +30,8 @@ struct tpmfront_info
 };
 
 
-struct tx_buffer {
+struct tx_buffer
+{
        unsigned int size;      // available space in data
        unsigned int len;       // used space in data
        unsigned char *data;    // pointer to a page
index a2fc2c6335a053fbf96b0f27def8074d531021a6..50e8f7f016a739f5635154f780e6a690c5a283e2 100644 (file)
@@ -39,7 +39,7 @@ class TPMifController(DevController):
         """@see DevController.getDeviceDetails"""
         
         devid = int(sxp.child_value(config, 'instance', '0'))
-        log.error("The domain has a TPM with instance %d." % devid)
+        log.debug("The domain has a TPM with instance %d." % devid)
 
         back  = { 'instance' : "%i" % devid }
         front = { 'handle' : "%i" % devid }
index ee5689c1a170c010a0f3c5824481b95875d78db4..29ad2d227f4382223b0c4072c71b6f38115a28fd 100644 (file)
@@ -20,8 +20,7 @@ typedef struct {
     unsigned long addr;   /* Machine address of packet.   */
     int      ref;         /* grant table access reference */
     u16      id;          /* Echoed in response message.  */
-    u16      size:15;     /* Packet size in bytes.        */
-    u16      mapped:1;
+    u16      size;        /* Packet size in bytes.        */
 } tpmif_tx_request_t;
 
 /*
@@ -30,13 +29,16 @@ typedef struct {
  */
 typedef u32 TPMIF_RING_IDX;
 
-#define TPMIF_TX_RING_SIZE 16
+#define TPMIF_TX_RING_SIZE 10
 
 /* This structure must fit in a memory page. */
+
+typedef struct {
+    tpmif_tx_request_t req;
+} tpmif_ring_t;
+
 typedef struct {
-    union {
-        tpmif_tx_request_t  req;
-    } ring[TPMIF_TX_RING_SIZE];
+    tpmif_ring_t ring[TPMIF_TX_RING_SIZE];
 } tpmif_tx_interface_t;
 
 #endif